//
//  main.swift
//  CLearning_@_silgen_name
//
//  Created by chenyh on 2020/12/25.
//

//import Foundation
//c中的函数名具有全局唯一性
//使用swift中@_silgen_name("")可将C函数抓换
//@_silgen_name("ht_add2")
//func swift_ht_add(_ a: Int32,_ b: Int32) -> Int32
//    print(swift_ht_add(2, 3))

/**
 自动搜索和调用C函数

 C函数不具备重载功能，编译后的符号是在函数名前加_
 （如test函数，编译后的符号名为_test）
 所以C函数具备全局唯一性。正是利用这一特性，@_silgen_name可自动搜索和调用c函数
 @_silgen_name使用：

 直接生成.c实现文件
 swift文件中使用@_silgen_name传入c函数，并创建swift替换函数，直接调用swift替换函数，即可实现c函数

 */
//print("Hello, World!")
//
//print(ht_add(2,3))

/**
 3.main.swift文件中，@_silgen_name传入c函数(ht_add)，并创建swift替换函数(swift_ht_add)，直接调用swift替换函数(swift_ht_add)，即可实现c函数 ：

 */

/**
 size: 实际占用内存大小
 stride:系统分配的内存大小
 指定类型：

 仅一个case项：size为0（高版本xcode可能为1 ），stride为1）
 多个case项:
 case小于255个： size为1，stride为1
 超过255个会自动扩容，size和stride都会增加。
 （原因，1字节(8bit)可区分255种情况。所以默认size为1，当只有一个case时，0x0即可表示。所以size为0和1都可理解）

 */

enum Fool {
    case a(name: String)
}
//在枚举中是按最大的case 算占用内容和实际内存
enum Foo2  {
//    case a(name: String)
    //Int16是2：个字节 int8：1个字节 Double:8：个字节
//    case b(age: Int16,width: Double,flag: Int8)
    case c(age: String)
    case d(age: Int8)
    case b(age: Int16,width: Double,flag: Int8)
    case f(age: Int16,width: Double,flag: Int8)
    //分配内存24 实际内存是18 8*2+2 所以分三段8
}
//这下就能说清楚为什么它当时是18 而不是17了
// string占用16个字节 而当枚举中case数大于1的时候它会占用1个字节
// 0 1 2 3 4 5 6 7
// 8 9 10 11 12 13 14 15
// 16
// 17  所以实际长度是18 0-17 因为他是8的倍数 所以 17保存在第三段 总分配为24
//print("---Foo1-----")
//print(MemoryLayout<Fool>.size)   // 16
//print(MemoryLayout<Fool>.stride) // 16是最大字节8的倍数 所以是16
//print("---Foo2-----")
//print(MemoryLayout<Foo2>.size) //
//print(MemoryLayout<Foo2>.stride)
